/**
 * 给定AB？的字符串，再给定K，N在1000，K在10
 * 要求长度为K的子串不是回文，用A和B取替换？，问一共有多少种不同的方案
 * 设Dij为到第i个位置后k个字母为状态j的情况下的方案总数
 * 则最后答案为 SIGMA{D[N][j], j是所有可能的状态}
 * 
 * 令最高位为第K-1位
 * Dij 对 D[i+1][j<<1] 有贡献，当第i+1个位置为A且符合条件时
 * Dij 对 D[i+1][(j<<1)|1] 有贡献，当第i+1个位置为B且符合条件时
 * 符合条件就是指长度为K的子串不是回文。长度不足K，显然符合条件；长度大于等于K，判断一下status即可
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using Real = long double;

llt const MOD = 998244353LL;

int N, K;
string S;
vector<vll> D;
int MSK;

string decode(int status, int pos){
    string s;
    for(int i=0;i<min(pos, K);++i){
        if(status & (1 << i)) s += 'B';
        else s += 'A';
    }
    return s;
}

int shift(int x){
    return (x << 1) & MSK;
}

bool isOK(int status, int len){
    if(len < K) return true;

    for(int x,y,u=0,v=K-1;u<=v;++u,--v){
        x = (status & (1 << u)) ? 1 : 0;
        y = (status & (1 << v)) ? 1: 0;
        if(x != y) return true;
    }
    return false;
}

llt proc(){
    D.assign(N + 1, vll(MSK + 1, 0LL));
    
    if(S[1] == 'A') D[1][0] = 1;
    else if(S[1] == 'B') D[1][1] = 1;
    else D[1][0] = D[1][1] = 1;

    for(int i=1;i<N;++i){
        for(int j=0;j<=MSK;++j){
            switch(S[i + 1]){
                case 'A': if(isOK(shift(j), i + 1))(D[i + 1][shift(j)] += D[i][j]) %= MOD; break;
                case 'B': if(isOK(shift(j) | 1, i + 1))(D[i + 1][shift(j) | 1] += D[i][j]) %= MOD; break;
                case '?': if(isOK(shift(j), i + 1))(D[i + 1][shift(j)] += D[i][j]) %= MOD; if(isOK(shift(j) | 1, i + 1))(D[i + 1][shift(j) | 1] += D[i][j]) %= MOD; break;
                default: assert(0);
            }
        }    
    }

#ifndef ONLINE_JUDGE
    for(int i=1;i<=N;++i){
        cout << i << ":" << endl;
        for(int j=0;j<=MSK;++j){
            cout << decode(j, i) << ": " << D[i][j] << endl;
        }
    }
#endif

    llt ans = 0;
    for(int j=0;j<=MSK;++j) ans = (ans + D[N][j]) % MOD;
    return ans;
}

void work(){ 
    cin >> N >> K >> S;
    S = " " + S;
    MSK = (1 << K) - 1;
    cout << proc() << endl;
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}